package net.wwang.open.util;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author WangWei
 * @date 2020/8/11
 */
public class DateUtil {
    private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
    public final static char[] upper = "零一二三四五六七八九十".toCharArray();

    static SimpleDateFormat format;

    /**
     * 日期格式：yyyy-MM-dd HH:mm:ss
     **/
    public static final String DF_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期格式：yyyy-MM-dd HH:mm
     **/
    public static final String DF_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";

    /**
     * 日期格式：yyyy-MM-dd
     **/
    public static final String DF_YYYY_MM_DD = "yyyy-MM-dd";

    /**
     * 日期格式：yyyy-MM-dd
     **/
    public static final String DF_YYYY_MM = "yyyy-MM";
    /**
     * 日期格式：HH:mm:ss
     **/
    public static final String DF_HH_MM_SS = "HH:mm:ss";

    /**
     * 日期格式：HH:mm
     **/
    public static final String DF_HH_MM = "HH:mm";


    /**
     * 获取系统当前日期
     *
     * @return
     */
    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 将日期以yyyy-MM-dd HH:mm:ss等指定格式进行格式化
     *
     * @param date     日期
     * @param formater 格式化样式
     * @return 格式化字符串
     */
    public static String formatDateTime(Date date, String formater) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(formater);
            return sdf.format(date);
        } catch (Exception e) {
            return "";
        }

    }

    /**
     * 将java.util.Date对象转化为String字符串
     *
     * @param date      要格式的java.util.Date对象
     * @param strFormat 输出的String字符串格式的限定（如："yyyy-MM-dd HH:mm:ss"）
     * @return 表示日期的字符串
     */
    public static String dateToStr(Date date, String strFormat) {
        SimpleDateFormat sf = new SimpleDateFormat(strFormat);
        String str = sf.format(date);
        return str;
    }

    /**
     * 将String字符串转换为java.util.Date格式日期
     *
     * @param strDate    表示日期的字符串
     * @param dateFormat 传入字符串的日期表示格式（如："yyyy-MM-dd HH:mm:ss"）
     * @return java.util.Date类型日期对象（如果转换失败则返回null）
     */
    public static Date strToUtilDate(String strDate, String dateFormat) {
        SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
        Date date = null;
        try {
            date = sf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 将java.sql.Timestamp对象转化为String字符串
     *
     * @param time      要格式的java.sql.Timestamp对象
     * @param strFormat 输出的String字符串格式的限定（如："yyyy-MM-dd HH:mm:ss"）
     * @return 表示日期的字符串
     */
    public static String dateToStr(Timestamp time, String strFormat) {
        DateFormat df = new SimpleDateFormat(strFormat);
        String str = df.format(time);
        return str;
    }

    /**
     * 将String字符串转换为java.sql.Timestamp格式日期,用于数据库保存
     *
     * @param strDate    表示日期的字符串
     * @param dateFormat 传入字符串的日期表示格式（如："yyyy-MM-dd HH:mm:ss"）
     * @return java.sql.Timestamp类型日期对象（如果转换失败则返回null）
     */
    public static Timestamp strToSqlDate(String strDate, String dateFormat) {
        SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
        Date date = null;
        try {
            date = sf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Timestamp dateSQL = new Timestamp(date.getTime());
        return dateSQL;
    }

    /**
     * 将java.util.Date对象转化为java.sql.Timestamp对象
     *
     * @param date 要转化的java.util.Date对象
     * @return 转化后的java.sql.Timestamp对象
     */
    public static Timestamp dateToTime(Date date) {
        String strDate = dateToStr(date, "yyyy-MM-dd HH:mm:ss SSS");
        return strToSqlDate(strDate, "yyyy-MM-dd HH:mm:ss SSS");
    }

    /**
     * 将java.sql.Timestamp对象转化为java.util.Date对象
     *
     * @param time 要转化的java.sql.Timestamp对象
     * @return 转化后的java.util.Date对象
     */
    public static Date timeToDate(Timestamp time) {
        return time;
    }

    /**
     * 获取YYYY格式
     *
     * @return
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 获取YYYY格式
     *
     * @return
     */
    public static String getYear(Date date) {
        return formatDate(date, "yyyy");
    }

    /**
     * 获取YYYY-MM-DD格式
     *
     * @return
     */
    public static String getDay() {
        return formatDate(new Date(), "yyyy-MM-dd");
    }

    /**
     * 获取YYYY-MM-DD格式
     *
     * @return
     */
    public static String getDay(Date date) {
        return formatDate(date, "yyyy-MM-dd");
    }

    /**
     * 获取YYYYMMDD格式
     *
     * @return
     */
    public static String getDays() {
        return formatDate(new Date(), "yyyyMMdd");
    }

    /**
     * 获取YYYYMMDD格式
     *
     * @return
     */
    public static String getDays(Date date) {
        return formatDate(date, "yyyyMMdd");
    }

    /**
     * 获取YYYYMM格式
     *
     * @return
     */
    public static String getMouth(Date date) {
        return formatDate(date, "yyyy-MM");
    }

    /**
     * 获取YYYY-MM-DD HH:mm:ss格式
     *
     * @return
     */
    public static String getTime() {
        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取YYYY-MM-DD HH:mm:ss.SSS格式
     *
     * @return
     */
    public static String getMsTime() {
        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
    }

    /**
     * 获取YYYYMMDDHHmmss格式
     *
     * @return
     */
    public static String getAllTime() {
        return formatDate(new Date(), "yyyyMMddHHmmss");
    }

    /**
     * 获取YYYY-MM-DD HH:mm:ss格式
     *
     * @return
     */
    public static String getTime(Date date) {
        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取自己想要的日期格式，如果没有，默认 yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式
     * @return
     */
    public static String formatDate(Date date, String pattern) {
        String formatDate = null;
        if (StringUtils.isNotBlank(pattern)) {
            formatDate = DateFormatUtils.format(date, pattern);
        } else {
            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }

    /**
     * 日期比较
     *
     * @param s 日期一
     * @param e 日期二
     * @return 日期比较，如果s>=e 返回true 否则返回false
     */
    public static boolean compareDate(String s, String e) {
        if (parseDate(s) == null || parseDate(e) == null) {
            return false;
        }
        return parseDate(s).getTime() >= parseDate(e).getTime();
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static Date parseDate(String date) {
        return parse(date, "yyyy-MM-dd");
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static Date parseTime(String date) {
        return parse(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static Date parse(String date, String pattern) {
        try {
            return DateUtils.parseDate(date, pattern);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static String format(Date date, String pattern) {
        return DateFormatUtils.format(date, pattern);
    }

    /**
     * 把日期转换为Timestamp
     *
     * @param date
     * @return
     */
    public static Timestamp format(Date date) {
        return new Timestamp(date.getTime());
    }

    /**
     * 校验日期是否合法
     *
     * @return
     */
    public static boolean isValidDate(String s) {
        return parse(s, "yyyy-MM-dd HH:mm:ss") != null;
    }

    /**
     * 校验日期是否合法
     *
     * @return
     */
    public static boolean isValidDate(String s, String pattern) {
        return parse(s, pattern) != null;
    }


    /**
     * 得到一年的差，同一年为0
     *
     * @param startTime 开始日期
     * @param endTime   结束日期
     * @return
     */
    public static int getDiffYear(String startTime, String endTime) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(startTime).getTime()) / (1000 * 60 * 60 * 24)) / 365);
            return years;
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            return 0;
        }
    }

    /**
     * <li>功能描述：时间相减得到天数
     *
     * @param beginDateStr
     * @param endDateStr
     */
    public static long getDaySub(String beginDateStr, String endDateStr) {
        long day = 0;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date beginDate = null;
        Date endDate = null;
        try {
            beginDate = format.parse(beginDateStr);
            endDate = format.parse(endDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
        return day;
    }

    /**
     * 得到当前日期的n天之后的日期
     *
     * @param days 天数
     * @return
     */
    public static String getAfterDayDate(int days) {
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();
        SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfd.format(date);
        return dateStr;
    }

    /**
     * 得到当前日期的n天之后是周几
     *
     * @param days 天数
     * @return
     */
    public static String getAfterDayWeek(int days) {
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        String dateStr = sdf.format(date);
        return dateStr;
    }

    /**
     * 该方法是通过开始日期和结束日期得到
     * 开始日期：2018-3-1
     * 结束日期：2018-4-2
     * 输出的格式：
     * {
     * "days": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,1,2,",
     * "months": "2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年3月,2018年4月,2018年4月,",
     * "shortName": "222",
     * "weeks": "第1周,第1周,第1周,第1周,第2周,第2周,第2周,第2周,第2周,第2周,第2周,第3周,第3周,第3周,第3周,第3周,第3周,第3周,第4周,第4周,第4周,第4周,第4周,第4周,第4周,第5周,第5周,第5周,第5周,第5周,第5周,第1周,第2周,",
     * "projectNumber": "22"
     * }
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return
     */
    public static Map<String, Object> formatDate(Calendar start, Calendar end) throws ParseException {
        Map<String, Object> map = new HashMap();

        List<String> months = new ArrayList<>();
        List<String> weeks = new ArrayList<>();
        List<String> weekNums = new ArrayList<>();
        List<String> days = new ArrayList<>();
        List<String> monthAndDays = new ArrayList<>();
        int allDays = differentDays(start.getTime(), end.getTime());
        for (int i = 0; i <= allDays; i++) {
            //获取年份
            int year = start.get(Calendar.YEAR);
            //获取月
            int month = start.get(Calendar.MONTH) + 1;

            months.add(year + "-" + month);
            //获取日期
            int day = start.get(Calendar.DATE);
            days.add(day + "");
            // 判断这周是不是周一
            if (start.get(Calendar.DAY_OF_WEEK) == 2) {
                monthAndDays.add(month + "." + day);
            }

            // 设置一周的开始时间为星期一
            start.setFirstDayOfWeek(Calendar.MONDAY);
            //获取周几
            String weekNum = getWeekOfDate(year + "-" + month + "-" + day);
            weekNums.add(weekNum);

            //获取周
            int weekOfMonth = start.get(Calendar.WEEK_OF_MONTH);
            weeks.add("第" + weekOfMonth + "周");
            start.add(Calendar.DATE, 1);
        }
        map.put("monthAndDays", monthAndDays);
        map.put("months", months);
        map.put("weeks", weeks);
        map.put("weekNums", weekNums);
        map.put("days", days);
        return map;
    }

    /**
     * 获取指定日期是星期几
     * 参数为null时表示获取当前日期是星期几
     *
     * @param date
     * @return
     */
    public static String getWeekOfDate(String date) throws ParseException {
        // String[] weekOfDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        String[] weekOfDays = {"日", "一", "二", "三", "四", "五", "六"};
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        if (date != null) {
            calendar.setTime(df.parse(date));
        }
        int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        return weekOfDays[w];
    }

    /**
     * 获取当前系统日期的周一和周日日期
     *
     * @return map
     * @author songsl
     */
    public static Map getWeekMonAndSun() {
        Map map = new HashMap();
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        cal.add(Calendar.DATE, -1);
        // 获取本周一的日期
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        //当前日期的周一
        String monday = df.format(cal.getTime());

        // 这种输出的是上个星期周日的日期，因为老外那边把周日当成第一天
        cal.add(Calendar.DATE, -1);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        // 增加一个星期，才是我们中国人理解的本周日的日期
        cal.add(Calendar.WEEK_OF_YEAR, 1);
        //当前日期的周日
        String sunday = df.format(cal.getTime());

        map.put("monday", monday);
        map.put("sunday", sunday);
        return map;
    }

    /**
     * 获取当前日期的上周一
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date geLastWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -7);
        return cal.getTime();
    }

    /**
     * 获取当前日期的上周日
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date geLastWeekSunday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -1);
        return cal.getTime();
    }

    /**
     * 获取当前日期的周一
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date getThisWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return cal.getTime();
    }

    /**
     * 获取当前日期的周日
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date getThisWeekSunday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 6);
        return cal.getTime();
    }

    /**
     * 获取当前日期的下周一
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date getNextWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 7);
        return cal.getTime();
    }

    /**
     * 获取当前日期的下周日
     *
     * @param date
     * @return
     * @author songsl
     */
    public static Date getNextWeekSunday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 13);
        return cal.getTime();
    }

    /**
     * 获得某个日期的周一到周几的日期列表
     *
     * @param date       待查询的日期字符串
     * @param dateFormat 日期格式
     * @param isChina    是否按国内的星期格式
     * @param number     从待查询日期所在的周一开始计算,如7，就是本周七天日期
     * @return 周一到周几的日期字符串列表
     * @throws Exception
     * @author songsl
     */
    public static List<String> getWeekDays(String date, String dateFormat, boolean isChina, int number) throws Exception {
        List<String> list = new ArrayList<String>();
        Calendar c = Calendar.getInstance(Locale.CHINA);
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        c.setTime(sdf.parse(date));
        int currentYear = c.get(Calendar.YEAR);
        int weekIndex = c.get(Calendar.WEEK_OF_YEAR);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == 1 && isChina) {
            c.add(Calendar.DAY_OF_MONTH, -1);
            String dateStr = sdf.format(c.getTime());
            list = getWeekDays(dateStr, dateFormat, isChina, number);
        } else {
            c.setWeekDate(currentYear, weekIndex, 1);
            for (int i = 1; i <= number; i++) {
                c.add(Calendar.DATE, 1);
                String dateStr = sdf.format(c.getTime());
                list.add(dateStr);
            }
        }
        return list;
    }

    /**
     * 获取周一和周日的日期，改变上周或者下周
     *
     * @param weekStartDate 周开始日期
     * @param weekEndDate   周结束日期
     * @param weekStatus    周状态：当前周参数为“”，上一周参数为front，下一周参数为next , 选定的周 “selects”
     * @return
     * @author songsl
     */
    public static Map<String, String> getChangeWeekDate(String weekStartDate, String weekEndDate, String weekStatus) throws Exception {
        Map<String, String> map = new HashMap();
        //当前系统日期
        Date nowDate = new Date();
        //将字符串转换成date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //上一周
        String front = "front";
        //下一周
        String next = "next";
        //选定的周
        String selects = "selects";
        //周一
        String mondayDate = "";
        //周日
        String sundayDate = "";
        //如果周状态参数为front，并且周开始日期和周结束日期有值,则获取上一周的日期
        if (front.equals(weekStatus) && !"".equals(weekStartDate) && !"".equals(weekEndDate)) {
            //上周一
            mondayDate = sdf.format(DateUtil.geLastWeekMonday((Date) sdf.parse(weekStartDate)));
            //上周日
            sundayDate = sdf.format(DateUtil.geLastWeekSunday((Date) sdf.parse(weekEndDate)));
            //如果周状态参数为next，并且周开始日期和周结束日期有值,则获取下一周的日期
        } else if (next.equals(weekStatus) && !"".equals(weekStartDate) && !"".equals(weekEndDate)) {
            //下周一
            mondayDate = sdf.format(DateUtil.getNextWeekMonday((Date) sdf.parse(weekStartDate)));
            //下周日
            sundayDate = sdf.format(DateUtil.getNextWeekSunday((Date) sdf.parse(weekEndDate)));
            //如果周状态为selects，并且周开始日期和周结束日期有值, 则获取现在的日期
        } else if (selects.equals(weekStatus) && !"".equals(weekStartDate) && !"".equals(weekEndDate)) {
            //周一
            mondayDate = weekStartDate;
            //周日
            sundayDate = weekEndDate;
            //否则获取当前周的日期
        } else {
            //本周一
            mondayDate = sdf.format(DateUtil.getThisWeekMonday(nowDate));
            //本周日
            sundayDate = sdf.format(DateUtil.getThisWeekSunday(nowDate));
        }
        //周一
        map.put("mondayDate", mondayDate);
        //周日
        map.put("sundayDate", sundayDate);
        return map;
    }

    /**
     * 转换时间大写
     *
     * @param date
     * @return
     */
    public static String getUpperDate(String date) {
        //支持yyyy-MM-dd、yyyy/MM/dd、yyyyMMdd等格式
        if (date == null) {
            return null;
        }
        //非数字的都去掉
        date = date.replaceAll("\\D", "");
        if (date.length() != 8) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {//年
            sb.append(upper[Integer.parseInt(date.substring(i, i + 1))]);
        }
        sb.append("年");//拼接年
        int month = Integer.parseInt(date.substring(4, 6));
        if (month <= 10) {
            sb.append(upper[month]);
        } else {
            sb.append("十").append(upper[month % 10]);
        }
        sb.append("月");//拼接月

        int day = Integer.parseInt(date.substring(6));
        if (day <= 10) {
            sb.append(upper[day]);
        } else if (day < 20) {
            sb.append("十").append(upper[day % 10]);
        } else {
            sb.append(upper[day / 10]).append("十");
            int tmp = day % 10;
            if (tmp != 0) {
                sb.append(upper[tmp]);
            }
        }
        sb.append("日");//拼接日
        return sb.toString();
    }

    /**
     * W3C XML 模式时间数据类型与java Date进行转换
     *
     * @param date     2011-12-05T11:30:02.000Z
     * @param timeZone //"GMT":格林尼治时间, "UTC":世界统一时间
     */
    public static Timestamp getW3cTimeConvertString2Date(String date, String timeZone) throws Exception {
        if (ObjectUtils.isEmpty(timeZone)) {
            timeZone = "UTC";
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.CHINESE);
        format.setTimeZone(TimeZone.getTimeZone(timeZone));
        Date parse = format.parse(date);
        Timestamp timestamp = DateUtil.format(parse);
        return timestamp;
    }

    /**
     * 得到昨天日期 yyyy-MM-dd
     *
     * @return
     */
    public static String getYesterDay() {
        Calendar calendar = Calendar.getInstance();
        // 把当前时间赋给日历
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        // 设置为前一天
        Date dBefore = calendar.getTime();
        //日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //设置时间格式
        String defaultStartDate = sdf.format(dBefore);
        return defaultStartDate;
    }

    /**
     * 获取某年的最后一天
     *
     * @return
     */
    public static Calendar getYearLast(Calendar current) {
        int year = current.get(Calendar.YEAR);
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);
        Date currYearLast = calendar.getTime();
        calendar.setTime(currYearLast);
        return calendar;
    }

    /**
     * 获取某年的第一
     *
     * @return
     */
    public static Calendar getYearFirst(Calendar current) {
        int year = current.get(Calendar.YEAR);
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        calendar.setTime(currYearFirst);
        return calendar;
    }

    /**
     * 得到这一年有多少天
     *
     * @param year
     * @return
     */
    public static int getDaysByYear(int year) {
        int days;//某年(year)的天数
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//闰年的判断规则
            days = 366;
        } else {
            days = 365;
        }
        return days;
    }

    /**
     * date2比date1多的天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDays(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);
        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        if (year1 != year2) {//同一年
            int timeDistance = 0;
            for (int i = year1; i < year2; i++) {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { //闰年
                    timeDistance += 366;
                } else {//不是闰年
                    timeDistance += 365;
                }
            }
            return timeDistance + (day2 - day1);
        } else {//不同年
            logger.info("判断day2 - day1 : " + (day2 - day1));
            return day2 - day1;
        }
    }

}
